{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 23\n",
    "\n",
    "# 非正交坐标系\n",
    "Book_3《数学要素》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3bf36d53-c622-4558-904d-b649cf0d48ea",
   "metadata": {},
   "source": [
    "这个代码通过矩阵变换来展示二维向量和网格的线性变换效果。首先，代码定义了一个二维网格，该网格的横纵坐标分别为$x_1$和$x_2$，表示为矩阵$X$，每一列是一个二维坐标点。然后，通过定义的变换矩阵 \n",
    "\n",
    "$$\n",
    "R = \\begin{bmatrix} 1 & 3 \\\\ 2 & 1 \\end{bmatrix}\n",
    "$$ \n",
    "\n",
    "对原始网格$X$进行线性变换。变换的结果为 \n",
    "\n",
    "$$\n",
    "Z = X \\cdot R^T\n",
    "$$ \n",
    "\n",
    "即新的坐标点矩阵$Z$，其中每一个点在新坐标系下的坐标分别表示为$z_1$和$z_2$。\n",
    "\n",
    "代码通过绘制原始网格以及变换后的网格，直观展示了变换如何作用于点的分布。此外，还绘制了三个向量在变换前和变换后的位置，包括向量$[1,2]$、$[3,1]$和$[10,10]$，以可视化展示线性变换对不同向量的效果。最终结果包括两个子图，一个展示原始坐标系中的网格和向量，另一个展示变换后的坐标系中的网格和向量，分别以$x_1, x_2$和$z_1, z_2$作为坐标。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1ba263c5-6d49-4b50-a861-2176661ac86c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56ac5314-d239-42a1-8a65-2f57eb75cef2",
   "metadata": {},
   "source": [
    "## 定义绘制向量的函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6cb7893b-8102-4952-b4dc-7464f3ee3aca",
   "metadata": {},
   "outputs": [],
   "source": [
    "def draw_vector(vector, RBG): \n",
    "    array = np.array([[0, 0, vector[0], vector[1]]])\n",
    "    X, Y, U, V = zip(*array)\n",
    "    plt.quiver(X, Y, U, V, angles='xy', scale_units='xy', scale=1, color=RBG, zorder = 1000) # 绘制向量"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9d47bba-5c55-4e40-919e-bc60d9b2499e",
   "metadata": {},
   "source": [
    "## 定义变量和网格"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3f6bd74c-b79f-4286-a9ac-aa7bd6bc83ca",
   "metadata": {},
   "outputs": [],
   "source": [
    "x1 = np.arange(-25, 25 + 1, step=1) # 定义x1轴的范围\n",
    "x2 = np.arange(-25, 25 + 1, step=1) # 定义x2轴的范围\n",
    "\n",
    "XX1, XX2 = np.meshgrid(x1, x2) # 生成网格\n",
    "\n",
    "X = np.column_stack((XX1.ravel(), XX2.ravel())) # 合并网格点的坐标"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c5081e64-33ab-4ff1-8413-8aa935fa3929",
   "metadata": {},
   "source": [
    "## 定义变换矩阵R"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5f4da03a-9169-4a27-9305-47774686f3f7",
   "metadata": {},
   "outputs": [],
   "source": [
    "R = np.matrix('1,3;2,1') # 定义变换矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a342bb50-55e1-44b4-9c0e-9472c2399d7d",
   "metadata": {},
   "outputs": [],
   "source": [
    "Z = X @ R.T # 对X应用矩阵变换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "d0d6b3a5-8546-42ed-b8e4-8cef247da1be",
   "metadata": {},
   "outputs": [],
   "source": [
    "ZZ1 = Z[:, 0].reshape((len(x1), len(x2))) # 变换后的z1坐标\n",
    "ZZ2 = Z[:, 1].reshape((len(x1), len(x2))) # 变换后的z2坐标"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5cb929cd-61e7-4cac-94a8-8557e9998d01",
   "metadata": {},
   "source": [
    "## 原始坐标系下的网格和向量图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a7637c89-fdc9-48fb-9875-23fdb0046370",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.plot(XX1, XX2, color=[0.8, 0.8, 0.8]) # 绘制网格线\n",
    "plt.plot(XX1.T, XX2.T, color=[0.8, 0.8, 0.8]) # 绘制网格线的转置\n",
    "\n",
    "draw_vector([1, 2], np.array([0, 112, 192]) / 255) # 绘制向量[1,2]\n",
    "draw_vector([3, 1], np.array([255, 0, 0]) / 255) # 绘制向量[3,1]\n",
    "draw_vector([10, 10], '#FF99FF') # 绘制向量[10,10]\n",
    "\n",
    "plt.xlabel('$x_1$ (number of chickens)') # x轴标签\n",
    "plt.ylabel('$x_2$ (number of rabbits)') # y轴标签\n",
    "\n",
    "plt.axis('scaled') # 保持坐标轴比例\n",
    "ax.set_xlim([0, 10]) # 设置x轴范围\n",
    "ax.set_ylim([0, 10]) # 设置y轴范围\n",
    "\n",
    "plt.xticks(np.arange(0, 10 + 1, step=2)) # 设置x轴刻度\n",
    "plt.yticks(np.arange(0, 10 + 1, step=2)) # 设置y轴刻度\n",
    "\n",
    "ax.spines['top'].set_visible(False) # 隐藏顶部边框\n",
    "ax.spines['right'].set_visible(False) # 隐藏右边框"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f991a866-de53-4212-aeee-418cc7221474",
   "metadata": {},
   "source": [
    "## 变换后坐标系下的网格和向量图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "dc6b9a93-e374-4700-901d-79c7bd09400c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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pHCEWJJPNsVy6qmnsnXr1uzjRYsWUVtbyy9/+cucr1+4cCFVVVW89NJL2edGRkZ49dVXOemkk3yPw+Xll18e93jRokWUl5f7+t7pdJqf/OQnfPe730Uplf3vtddeY/78+WOuStu8eTNz586lubm55P8PQciFFI4QO2699VYeeOABnnrqKaqrq9m7dy8AjY2NVFdXF/Ve5513HjfeeGP2k35NTQ033HAD69ato6qqig996EPs37+fLVu2sHr1aqZMmcKaNWu4/vrraWpq4rjjjuOuu+7i8OHDrF69uuT/t507d3Lddddx5ZVXsmHDBu6//36++93vAvj63k899RTd3d2sXr2a+vr6Mdsuuugi1q9fz1VXXQXAiy++yMc//vGS/x8EIR8iHCFWOI7Dd77zHXp7e1mxYsWYbS+//DJnnnlmUe+3ZMkSli1bxhNPPMGVV14JwM0330xFRQXf+MY32L17N62trXz5y1/Ofs2dd95JJpPh0ksvpa+vj2XLlvHMM89kD02VwqpVqxgYGGD58uWUl5ezdu1avvSlL/n+3uvXr+dP//RPx8kG4LOf/Sy33347GzZsYPHixfzsZz/jmWeeKfn/QRDyIQuwCVby3HPP8cADD/Dkk09O+tqnn36ar33ta2zevJmysmQeZf7Hf/xH/u3f/o1nn3026qEIFiOFI1jHeeedx4YNGzh06BBz587lZz/7GWeccUbe13/yk5/krbfeor29nXnz5mkcqTlUVlZy//33Rz0MwXKkcARBEAQtJPP4gSAIgqAdEY4gCIKgBRGOIAiCoAURjiAIgqAFEY4gCIKgBRGOIAiCoAURjiAIgqAFEY4gCIKgBRGOIAiCoAURjiAIgqAFEY4gCIKghf8PH0XNDZV2NjUAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "plt.plot(ZZ1, ZZ2, color=[0.8, 0.8, 0.8]) # 绘制变换后的网格线\n",
    "plt.plot(ZZ1.T, ZZ2.T, color=[0.8, 0.8, 0.8]) # 绘制变换后的网格线的转置\n",
    "\n",
    "draw_vector([1, 2], np.array([0, 112, 192]) / 255) # 绘制变换后的向量[1,2]\n",
    "draw_vector([3, 1], np.array([255, 0, 0]) / 255) # 绘制变换后的向量[3,1]\n",
    "draw_vector([10, 10], '#FF99FF') # 绘制变换后的向量[10,10]\n",
    "\n",
    "plt.xlabel('$z_1$ (combo A)') # x轴标签\n",
    "plt.ylabel('$z_2$ (combo B)') # y轴标签\n",
    "\n",
    "plt.axis('scaled') # 保持坐标轴比例\n",
    "ax.set_xlim([0, 10]) # 设置x轴范围\n",
    "ax.set_ylim([0, 10]) # 设置y轴范围\n",
    "\n",
    "plt.xticks(()) # 隐藏x轴刻度\n",
    "plt.yticks(()) # 隐藏y轴刻度\n",
    "\n",
    "ax.spines['top'].set_visible(False) # 隐藏顶部边框\n",
    "ax.spines['right'].set_visible(False) # 隐藏右边框"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85a80909-2aac-49ed-bb7a-f8cc6b80ee7d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ecd322f4-f919-4be2-adc3-69d28ef25e69",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
